項目71 モジュールオーグメンテーションを使って型を改善する
宣言のマージを使って、既存のAPIを改善したり、問題のある機能の仕様を禁止する
interfaceは宣言のマージができ、同じ名前のinterfaceが繰り返し定義されると、すべてをマージした結果を最終的なinterfaceとして利用する
上記の特性を使って、ライブラリの型定義を独自の方に上書きすることができる
JSON.parseの戻り値の型はanyだが、unkownに上書きすることで型安全性を高めることができる
code:ts
interface JSON {
parse(
text: string,
reviver?: (this: any, key: string, value: any) => any
): any;
// ...
}
declare var JSON: JSON;
interface JSON {
parse(
text: string,
reviver?: (this: any, key: string, value: any) => any
): unknown;
}
利用を避けたい機能がある場合、voidやエラー文字列を戻り値にしてメソッドを「ノックアウト」し、@deprecatedとマークする
code:ts
interface Set<T> {...}
interface SetConstructor {
/** @deprecated */
new (str: string): 'Error! new Set(string) is banned.';
}
declare var Set: SetConstructor;
const s = new Set('abc');
// ^? const s: "Error! new Set(string) is banned."
上記のテクニックには夏季の注意すべき点があることを覚えておく
オーバーロードは型レベルでしか適応されないため、実行時の動作と乖離が生まれるような上書きをしないこと
組み込みの型をより厳密で精度の高いものにするか、特定の何かを許可しないようにする際に利用する